package Thread;
//单例模式（懒汉写法）
class SingletonLazy{
    //加上volatile避免出现内存可见性问题，因为编译器优化是一个玄学问题，不知道JVM/编译器什么时候会进行代码优化
    private  static volatile SingletonLazy instance = null;
//    public static SingletonLazy getInstance(){
//        if (instance == null){
//            instance = new SingletonLazy();
//        }
//        return instance;
//    }
    //-----》解决线程不安全：加锁
    public static SingletonLazy getInstance(){
        //先判断是否需要加锁，再决定是不是真的加锁
        if (instance == null){
            synchronized (SingletonLazy.class){//synchronized修饰静态方法，直接对类
                if (instance == null){
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
    //做出限制，禁止别人去new这个实例
    private SingletonLazy(){}
}
public class Demo16 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
//        SingletonLazy s3 = new SingletonLazy();//此时会报错，因为不允许对该类进行实例化
        System.out.println(s1 == s2);
    }
}
